package edu.gdpu.memory.stringtable;

/**
 * @author mazebin
 * @date 2021年 07月15日 14:08:04
 */
public class StringTableDemo {
    public static void main(String[] args) {
        //   常量池中的信息，都会被加载到运行时常量池中， 这时 还只是常量池中的符号，还没有变为 java 字符串对象
        //ldc会将符号引用转变为字符串对象
        String s1 = "a";//懒创建
        String s2 = "b";
        String s3 = "a" + "b";//javac优化了，编译期间以确定为ab
        String s4 = s1 + s2;////+:StringBuilder.append->StringBuilder.toString
        String s5 = "ab";//不是显式new一个新对象，所以引用地址和s3是一样的
        String s6 = s4.intern();//不会将其放入StringTable
// 问
        System.out.println(s3 == s4);//false
        System.out.println(s3 == s5);//true
        System.out.println(s4 ==s5);//false
        System.out.println(s3 == s6);//true
        System.out.println(s4 == s6);//false
        String x2 = new String("c") + new String("d");
        String x1 = "cd";
     //  System.out.println(x1== x2);//true
        String intern = x2.intern();
// 问，如果调换了【最后两行代码】的位置呢，如果是jdk1.6呢
        System.out.println(x1 == x2);//false
        System.out.println(intern == x1);

    }
}
